package date;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

/**
 * @projectName: java-sample
 * @description:
 * @author: Adam
 * @create: 2019-11-07 16:25
 **/

public class DateDemo {

    public static void main(String[] args){
         //new DateDemo().basicDate();
         //new DateDemo().compareDate();
        //new DateDemo().dateFormat();
        new DateDemo().timeZoneFormata();
    }


    /**
     * 时间对象的创建
     */
    public void basicDate(){
        /*java.util 包提供了 Date 类来封装当前的日期和时间。 Date 类提供两个构造函数来实例化 Date 对象。
        第一个构造函数使用当前日期和时间来初始化对象。
        第二个构造函数接收一个参数，该参数是从1970年1月1日起的毫秒数。
        public Date() {
          this(System.currentTimeMillis());
        }
        public Date(long date) {
           fastTime = date;
        }*/

        //1.使用Date无参构造利器
        Date currentDate = new Date();
        System.out.println("当前时间为:"+currentDate);

        //2.使用Date有参构造器
        Date paramDate = new Date(System.currentTimeMillis());
        System.out.println(paramDate);

        //System.currentTimeMillis() 是从1970年1月1日起的毫秒数
        System.out.println("1970年1月1日起的毫秒数:"+System.currentTimeMillis());
        System.out.println("1970年1月1日起的毫秒数:"+paramDate.getTime());

        //打印的结果为：Fri Mar 12 00:00:00 CST 1999
        System.out.println(new Date(99, 2, 12).toString());
    }


    /**
     * 时间的比较
     */
    public void compareDate(){
        /*Java使用以下三种方法来比较两个日期：
        1.使用 getTime() 方法获取两个日期（自1970年1月1日经历的毫秒数值），然后比较这两个值。
        2.使用方法 before()，after() 和 equals()。例如，一个月的12号比18号早，则 new Date(99, 2, 12).before(new Date (99, 2, 18)) 返回true。
        3.使用 compareTo() 方法，它是由 Comparable 接口定义的，Date 类实现了这个接口。*/
        boolean flag = new Date(99, 2, 12).before(new Date (99, 2, 18));
        System.out.println(flag);

    }

    /**
     * 日期格式化
     */
    public void dateFormat(){

        Date now = new Date();
        //注意:有的格式大写，有的格式小写，例如 MM 是月份，mm 是分；HH 是 24 小时制，而 hh 是 12 小时制。
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("当前时间为："+sdf.format(now));

        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
        String  dateStr = "2019-11-7";

        try{
            Date t = sdf2.parse(dateStr);
            System.out.println(dateStr+" Parse as "+t);
        }catch (ParseException  e){
            e.printStackTrace();
        }

    }

    public void timeZoneFormata(){
        /*注：
        1.不管是在哪个时区System.currentTimeMillis()和date.getTime()的毫秒数都是相同的;
        2.System.out.printf(new date())时会打印当前时区的时间，是因为System.out.printf打印日期时会自动转换对应的时区;
        */
        Date date = new Date(System.currentTimeMillis());
        SimpleDateFormat bjsdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //设置北京时区
        bjsdf.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
        System.out.println(bjsdf.format(date));

    }
}
